//package collection.test1;

import java.util.*;

/**
 * Collections集合工具类的方法_sort(List,Comparator) -- 根据Student的年龄排序
 * 测试类
 * ctrl+alt+L : 调整代码规格
 */
public class Main {

    public static void main(String[] args) {

//        // 创建四个学生对象 存储到集合中
//        ArrayList<Student> list = new ArrayList<Student>();
//        list.add(new Student("rose", 18));
//        list.add(new Student("jack", 16));
//        list.add(new Student("abc", 16));
//        list.add(new Student("ace", 17));
//        list.add(new Student("mark", 16));
//
//        /* 让学生 按照年龄排序 升序*/
//        //要求 该list中元素类型  必须实现比较器Comparable接口
//        Collections.sort(list);//加注释试试
//        /*
//        解析:
//            1) 修饰符合返回值之间有T,即为泛型方法
//            2)  上界通配符 < ? extends E> :
//                    ?是 E 是子类或实现类 ;
//                下界通配符 < ? super E> :    , super是支持的意思
//                    ?是 E 的父类或接口
//            3) <T extends Comparable<T>> 和 <T extends Comparable<? super T>> 有什么不同
//            <T extends Comparable<T>>类型 T 必须实现 Comparable 接口，
//                并且这个接口的类型是 T。只有这样，T 的实例之间才能相互比较大小!!!
//                例如， 在实际调用时若使用的具体类是 Dog，那么 Dog 必须 implements Comparable<Dog>
//            <T extends Comparable<? super T>>类型T 必须实现Comparable 接口，并且这个接口的类型是T 或 T 的父类型。
//                这样声明后，T 的实例之间，T 的实例和它的父类的实例之间，可以相互比较大小!!!
//                例如， 在实际调用时若使用的具体类是 Dog (假设 Dog 有一个父类 Animal)，
//                Dog 可以从 Animal 那里继承 Comparable<Animal> ，或者自己 implements Comparable<Dog> 。
//            代码::
//            public static <T extends Comparable<? super T>> void sort(List<T> list) {
//                list.sort(null);
//            }
//         */
//        for (Student student : list) {
//            System.out.println(student);
//        }
//        System.out.println("====================");
//
//        //想要独立的定义规则去使用 可以采用Collections.sort(List list,Comparetor<T> c)方式，自己定义规则：
//        Collections.sort(list, new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
////                return o2.getAge()-o1.getAge();//以学生的年龄降序
//                // 年龄降序
//                int result = o2.getAge()-o1.getAge();//年龄降序(参数1<参数2, 这里是参数2-参数1是大于0,即降序)
//                if(result==0){//第一个规则判断完了 下一个规则 姓名的首字母 升序
//                    result = o1.getName().charAt(0)-o2.getName().charAt(0);
//                }
//                return result;
//            }
//        });
//
//        for (Student student : list) {
//            System.out.println(student);
//        }
    }


}
